package cl.tinet.trainee.proyecto.ejb;

import java.util.ArrayList;

import javax.annotation.PostConstruct;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;

import cl.tinet.trainee.proyecto.dao.InterfazGenericaDAO;
import cl.tinet.trainee.proyecto.dao.UsuarioDAO;
import cl.tinet.trainee.proyecto.excepciones.DatosNulosException;
import cl.tinet.trainee.proyecto.excepciones.ObjetoDuplicadoException;
import cl.tinet.trainee.proyecto.excepciones.ObjetoNoEncontradoException;
import cl.tinet.trainee.proyecto.modelo.Usuario;

/**
 * Clase que implementa los metodos de la interfaz InterfazUsuarioBean.
 * 
 * @author Jose Palma.
 * 
 */
@Stateless(mappedName = "userBean", name = "userBean")
public class UsuarioBeanImpl implements InterfazBeanGenerico<Usuario> {
    /**
      * 
      */
    private static final Logger LOG = Logger.getLogger(UsuarioBeanImpl.class);
    /**
     * Manejador de entidad y contexto de persistencia de los datos.
     */
    @PersistenceContext(unitName = "dsPalma")
    private EntityManager em;
    /**
     * Capa dao.
     */
    private InterfazGenericaDAO<Usuario> dao;

    /**
     * Instanciador de nuevo Entity Manager para cada acceso a la clase.
     */
    @PostConstruct
    public void init() {
        dao = new UsuarioDAO(em);
    }

    /**
     * {@inheritDoc}
     */
    public void agregar(Usuario nuevoUsuario) throws ObjetoDuplicadoException {
        Usuario usuario = null;
        try {
            usuario = buscar(nuevoUsuario);
        } catch (ObjetoNoEncontradoException e) {
            LOG.debug("USUARIO NO EXISTE" + nuevoUsuario.getUsername());
        }
        if (usuario != null) {
            throw new ObjetoDuplicadoException(
                    ObjetoDuplicadoException.OBJETO_DUPLICADO
                            + nuevoUsuario.getUsername());
        } else {
            LOG.debug("Agregar usuario: " + nuevoUsuario);
            dao.agregar(nuevoUsuario);
            LOG.debug("Agregar usuario - Agregado");
        }
    }

    /**
     * {@inheritDoc}
     */
    public void borrar(Usuario usuarioAEliminar)
            throws ObjetoNoEncontradoException {
        Usuario usuarioEncontrado = buscar(usuarioAEliminar);
        if (usuarioEncontrado != null) {
            dao.borrar(usuarioEncontrado);
        }
    }

    /**
     * {@inheritDoc}
     */
    public void actualizar(Usuario usuarioAActualizar)
            throws ObjetoNoEncontradoException {
        Usuario usuarioEncontrado = buscar(usuarioAActualizar);
        if (usuarioEncontrado != null) {
            usuarioEncontrado.copiar(usuarioAActualizar);
            dao.actualizar(usuarioEncontrado);
        }
    }

    /**
     * {@inheritDoc}
     */
    public Usuario buscar(Usuario usuarioABuscar)
            throws ObjetoNoEncontradoException {
        Usuario usuarioEncontrado = null;
        try {
            usuarioEncontrado = dao.buscar(usuarioABuscar);
        } catch (DatosNulosException e) {
            LOG.debug("LA CONSULTA NO OBTUVO DATOS: "
                    + usuarioABuscar.getUsername());
            throw new ObjetoNoEncontradoException(
                    ObjetoNoEncontradoException.OBJETO_NO_ENCONTRADO);

        }
        return (usuarioEncontrado);
    }

    /**
     * {@inheritDoc}
     */
    public ArrayList<Usuario> listar() {
        return dao.listar();
    }

}
